﻿/*
 * Script: "mapa_coordenada.js"
 * Copyright 2011 SISVOX.
 *
 * Licenciado bajo SISVOX, Version 1.0 (la "Licencia");
 * El codigo presente que compone este Software es propiedad unica y
 * exclusivamente de SISVOX, por lo tanto, usted no podrá utilizar este
 * archivo excepto en cumplimiento de la Licencia ofrecida por SISVOX.
 * Usted puede obtener una copia de la Licencia en:
 *
 *      Soluciones Integrales de Software Vox (SISVOX)
 *                 http://www.sisvox.com
 *
 *     - Carlos Calvo      <ccalvo@sisvox.com>
 *     - Andres Hernandez  <ahernandez@sisvox.com>
 *
 * A menos que sea requerido por la ley aplicable o se acuerde por escrito,
 * el software distribuido bajo la licencia se distribuye "TAL CUAL", CON
 * LAS GARANTIAS Y CONDICIONES expresadas en la "Licencia".
 */
 

/**
 * The Google Geocoding API: http://code.google.com/apis/maps/documentation/geocoding/index.html
 * Geocoding service: http://code.google.com/apis/maps/documentation/javascript/services.html#Geocoding
 */

// Inicialización de Variables

var map_busca_coo;
var infoBubbleTurno = null;
var geocoder 		= new google.maps.Geocoder();

var longitud_turno	= "";
var latitud_turno	= "";

var marker 			= new google.maps.Marker();


// =================================================================================================================
// ======================================= CREA EL MAPA PARA LAS COORDENADAS =======================================
// =================================================================================================================

function mapa_coordenada() {
	
	// Creamos el Mapa
	var centerPoint = new google.maps.LatLng( parseFloat(mapa_coord_x).toFixed(8), parseFloat(mapa_coord_y).toFixed(8) );
	var myOptions = {
		zoom: parseInt(mapa_zoom),
		zoomControlOptions: {
      		style: google.maps.ZoomControlStyle.LARGE
    	},
		center: centerPoint,
		panControl: true,
		mapTypeControl: false,
		scaleControl: true,
		streetViewControl: false,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	} 
	map_busca_coo = new google.maps.Map(document.getElementById("mapa_busca_coo"), myOptions);
	
	google.maps.event.addListener(map_busca_coo, 'click', function(event) {
		longitud_turno 	= event.latLng.lng();
		latitud_turno	= event.latLng.lat();
		processReverseGeocoding(event.latLng, showMarkerInfo);
	});
}


/**
 * Mostrar en el mapa los topónimos encontrados para la ubicación
 * (latitud, longitud) especificada
 *
 * @param   locations    Listado de topónimos encontrados para 
 *                                    una ubicación específica
 */

function showMarkerInfo( locations ) {
	
	// Centra el mapa en la ubicación especificada
	
	mapa_centro = new google.maps.LatLng( latitud_turno.toFixed(8), longitud_turno.toFixed(8) );
	map_busca_coo.setCenter( mapa_centro );
	
	// Limpia el Mapa
	marker.setMap(null);
	if ( infoBubbleTurno != null ) {
		if ( infoBubbleTurno.isOpen() ) {
			infoBubbleTurno.close();
		}
	}
	
	// Obtenemos las Coordenadas del Punto seleccionado
	longitud 	= latitud_turno.toFixed(8);
	latitud 	= longitud_turno.toFixed(8);
	
	// Convertimos las Coordenadas en Grados
	var longitud_g	= conv_grados(locations[0].geometry.location.lng(), "longitud");
	var latitud_g 	= conv_grados(locations[0].geometry.location.lat(), "latitud");

	// Seteamos los valores obtenidos en los campos respectivos
	document.getElementById("coord_x").value 		= longitud;
	document.getElementById("coord_y").value 		= latitud;
							
	document.getElementById("grados_coord_x").value = longitud_g;
	document.getElementById("grados_coord_y").value = latitud_g;
		
	
	// Creamos el Icono del Marcador
	var icono_marker = "../../../publico/imagenes/iconos/red_pushpin.png";
	var image = new google.maps.MarkerImage( icono_marker,
		new google.maps.Size( 25, 25 ),
		new google.maps.Point( 0, 0 ),
		new google.maps.Point( 0, 25 ));
	
	
	// Creamos el contenido del InfoWindow
	html 	= document.getElementById('infowindow_div_busca_coo').innerHTML;
	html	= html.replace("%%element.longitud%%",				longitud);
	html	= html.replace("%%element.latitud%%",				latitud);
	
	// Preparamos el mensaje con la información obtenida del proceso de georreferenciación inversa
	content = "<ul>";
	for ( var i = 0; i < locations.length; i++ ) {
		if ( locations[i].formatted_address ) {
			content += '<li>' + locations[i].formatted_address + '</li>';
		} else {
			content += '<li>No se encontró información.</li>';
		}
	}
	content += "</ul>";
	
	html	= html.replace("%%element.referencia%%",				content);
    
	
	infoBubble = new InfoBubble({
		maxWidth: 300,
		map: map_busca_coo,
		content: html,
		shadowStyle: 1,
		padding: 5,
		backgroundColor: '#FFFFFF',
		borderRadius: 15,
		arrowSize: 20,
		borderWidth: 2,
		borderColor: color_menu,
		disableAutoPan: false,
		hideCloseButton: false,
		arrowPosition: 50,
		arrowStyle: 0
	});
	
	// Creamos el Marcador
	marker = new google.maps.Marker({
		position: mapa_centro,
		map: map_busca_coo,
		title: "Ubicación",
		icon: image,
		infoBubblez: infoBubble
	});
	
	
	infoBubbleTurno = marker.infoBubblez;
	(marker.infoBubblez).open(map_busca_coo, marker);
}
	
	
/**
 * Obtener los posibles nombres de una ubicación geográfica a partir
 * de su localización (latitud, longitud).
 *
 * @param   location    Ubicación geográfica (latitud, longitud)
 * @param   callback    Función a ejecutarse después de una georrefereciación exitosa
 */

function processReverseGeocoding(location, callback) {
	// Propiedades de la georreferenciación
	var request = {
		latLng: location
	}
	
	// Invocación a la georreferenciación (proceso asíncrono)
	geocoder.geocode( request, function(results, status) {
		
		/*
		 * OK
		 * ZERO_RESULTS
		 * OVER_QUERY_LIMIT
		 * REQUEST_DENIED
		 * INVALID_REQUEST 
		 */
		if ( status == google.maps.GeocoderStatus.OK ) {
			document.getElementById('respuesta_busca_coo').innerHTML = "Respuesta: El Geocodificador ha encontrado resultados para la Busqueda.";
		} else {
			document.getElementById('respuesta_busca_coo').innerHTML = "Respuesta: No se han encontrado resultados para la Busqueda seleccionada.";
		}

		// En caso de terminarse exitosamente el proyecto ...
		if ( status == google.maps.GeocoderStatus.OK ) {
			// Invoca la función de callback
			callback (results);
			
			// Retorna los resultados obtenidos
			return results;
		} else {
			// Limpia el Mapa
			limpiar_mapa_coordenadas()
		}
			
		// En caso de error retorna el estado
		return status;
	});
}


// =================================================================================================================
// ====================================== LIMPIA LOS DATOS DE MAPA COORDENADA ======================================
// =================================================================================================================

function limpiar_mapa_coordenadas() {
	// Seteamos la Posicion y el Zoom Inicial del Mapa
	var centerPoint = new google.maps.LatLng( parseFloat(mapa_coord_x).toFixed(8), parseFloat(mapa_coord_y).toFixed(8) );
	map_busca_coo.setCenter( centerPoint,parseInt(mapa_zoom) );
	
	// Limpia los Datos sobre el Mapa
	marker.setMap(null);
	if ( infoBubbleTurno != null ) {
		if ( infoBubbleTurno.isOpen() ) {
			infoBubbleTurno.close();
		}
	}
	
	// Limpia los campos de Coordenadas
	document.getElementById("coord_x").value 			= "";
	document.getElementById("coord_y").value 			= "";
	document.getElementById("grados_coord_x").value 	= "";
	document.getElementById("grados_coord_y").value 	= "";
	
	document.getElementById("h_coord_x_centro").value 	= "";
	document.getElementById("h_coord_y_centro").value 	= "";
	
	document.getElementById("h_zoom_centro").value 		= "";
}


// =================================================================================================================
// ===================================== GUARDA LOS DATOS DEL CENTRO DEL MAPA ======================================
// =================================================================================================================

function guardar_coordenadas_centro() {
	
	centro = map_busca_coo.getCenter();
	document.getElementById("h_coord_x_centro").value 	= centro.lat().toFixed(8);
	document.getElementById("h_coord_y_centro").value 	= centro.lng().toFixed(8);
	
	document.getElementById("h_zoom_centro").value 		= map_busca_coo.getZoom();
}


// =================================================================================================================
// ===================================== CALCULA LAS COORDENADAS EN (º, ", ') ======================================
// =================================================================================================================

function roundNumber( rnum, rlength ) {
	var newnumber = Math.round(rnum*Math.pow(10,rlength))/Math.pow(10,rlength);
	return newnumber; 
}


function conv_grados( radianes, coord ) {

	if ( radianes < 0 ) {
		radianes = radianes * (-1);
		if ( coord == "latitud" ) {
			letra = " S";
		} else {
			letra = " W";
		}	
	} else {
		if ( coord == "latitud" ) {
			letra = " N";
		} else {
			letra = " E";
		}	
	}
	
	grados		= Math.abs(Math.floor(radianes));
	minutos_d	= (radianes-Math.floor(radianes))*60;	
	minutos		= Math.floor((radianes-Math.floor(radianes))*60);		
	segundos	= roundNumber(((minutos_d - Math.floor(minutos_d))*60),2);
	
	valor_g		= "   "+grados+"º "+minutos+"' "+segundos+'" '+letra;
	
	return (valor_g);
}